package com.htpay.model.vo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.htpay.util.ToolUtil;
import lombok.Data;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Map;

/**
 * 充值数据模型
 * <p>
 * sign采用md5
 * <p>
 * 1.生成签名方（通常为商户）首先对参数放入一个字符串数组 signFields，
 * 把参数和值放入一个对象或 map 中，使用 JSONObject 把这个对象转化成 json 对象。
 * 然后构建签名原文，在构建签名原文时，我们需把参数按照字典（比如a,b,c）顺序排序，
 * 具体排序方法直接调用 JAVA 的 Arrays.sort 方法。 然后使用 MD5 对签名原文进行签名。
 * <p>
 * 2.验签方（通常为开放平台的服务端）：和生产签名方一样先生成签名原文，然后使用 MD5 生成签名方传入的签名，
 * 把签名原文对生成签名方传入的签名进行验证，验证结果为 true 则说明验证成功，否则未通过。
 */
@Data
public class ChargeModel {

    /**
     * 商户ID
     */
    private Integer merchantId;

    /**
     * 通道类型:
     * <p>
     * 目前主要是支付宝H5
     */
    private String channelType;

    /**
     * 发起请求时间戳 yyyy-MM-dd HH:mm:ss
     * <p>
     * 如：2019-12-11 10:33:57
     */
    private String sendTimestamp;

    /**
     * 签名字符串
     */
    private String sign;

    /**
     * 调用的接口版本号：默认的1.0版本
     */
    private String apiVersion;

    /**
     * 回调通知url
     */
    private String notifyUrl;

    /**
     * 商家交易订单号
     */
    private String outTradeNo;

    /**
     * 交易金额
     */
    private String totalMoney;

    public void setExternalParams(String externalParams) throws Exception {
        Map<String, String> params = ToolUtil.urlParamsSplit(externalParams);
        this.externalParams = new ChargeParamsModel(params);
    }

    /**
     * 充值其他扩展参数
     */
    private ChargeParamsModel externalParams;
}
